/**
 * 新的数据结构 Set
 * 常用方法
 * 遍历
 * 应用场景
 * 1. 数组去重
 * WeakSet
 */

// object is not iterable
// let s = new Set({a:1,b:2,c:3})

let s = new Set([1,2,3,2])
s.add('aqie').add('bqie').delete(2)
// s.clear()
console.log(s, s.has(1), s.size)

/* s.forEach(item => console.log(item))

for(let i of s){
  console.log(i)
}

for(let i of s.keys()){
  console.log(i)
}

for(let i of s.values()){
  console.log(i)
}

for(let i of s.entries()){
  console.log(i[0], i[1])
} */

// 数组合并去重
let arr = [1,2,3]
let arr2 = [1,2,4]
let s2 = new Set([...arr, ...arr2])
console.log(s2)
// 返回数组 1
console.log([...s2])

// 返回数组 1
console.log(Array.from(s2))

// 求数组交集
let set1 = new Set(arr)
let set2 = new Set(arr2)
let result = new Set(arr.filter(item => set2.has(item)))
console.log(result)

// 求数组差集
let set3 = new Set(arr.filter(item => !set2.has(item)))
let set4 = new Set(arr2.filter(item => !set1.has(item)))
console.log('数组差集',[...set3,...set4]) // 3,4

// WeakSet 只能存储对象, 不能遍历 是弱引用
let ws = new WeakSet()
const obj1 = {sex:1}
ws.add({
  name:'aqie'
})
ws.add(obj1)

ws.delete({
  name:'aqie'
})

// 注意对象删除
ws.delete(obj1)
console.log(ws)

// 垃圾回收机制 GC
// 引用计数， 弱引用不在垃圾回收机制中
// 引用对象被垃圾回收，WeakSet引用也会自动消失